iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

寫遊戲初體驗系列 第 2

SFML Window

  • 分享至 

  • xImage
  •  

Window

如果要在SFML建立視窗,要使用 sf::RenderWindow 並指定視窗的解析度以及標題,這樣就可以產生一個簡單的視窗,並且開始處理事件循環,以及繪製東西在螢幕上。

sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");

sf::RenderWindow 的第三個參數可以指定視窗的 Style:

  • sf::Style::None
    • 沒有標題欄,不能跟其他 style 混合
    • 適合拿來當啟動畫面(Splash screen)
  • sf::Style::Titlebar
    • 有標題欄
  • sf::Style::Resize
    • 可以拉伸視窗
  • sf::Style::Close
    • 有關閉視窗按鈕
  • sf::Style::Fullscreen
  • sf::Style::Default
    • 等於 Titlebar | Resize | Close

事件循環

使用者與視窗互動時會產生事件(Event),如果不處理事件的化,整個視窗是不會有反應的,所以每個視窗 一定 要有處理事件的邏輯。

sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");

while (window.isOpen())
{
    sf::Event event;
    
    // 事件處裡,一定一定要有
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }
}

視窗操作

SFML 有提供一些基本的視窗操作

// 設定視窗位置
window.setPosition(sf::Vector2i(10, 50));

// 顯示或隱藏視窗
window.setVisible(false);

// 更改大小
window.setSize(sf::Vector2u(640, 480));

// 設定標題
window.setTitle("SFML window");

// 查詢大小
sf::Vector2u size = window.getSize();
unsigned int width = size.x;
unsigned int height = size.y;

// 是否正使用
window.hasFocus() == true;
// 提示系統要求關注視窗
window.requestFocus(); 
  • 滑鼠相關
// 顯示或隱藏滑鼠游標
window.setMouseCursorVisible(true);

// 限制滑鼠移動範圍
window.setMouseCursorGrabbed(true);
  • 查詢螢幕解析度
sf::VideoMode v = sf::VideoMode::getDesktopMode();
// v.width, v.height
  • fps 相關
// 開啟垂直同步
window.setVerticalSyncEnabled(true);
// 設定最高 fps
window.setFramerateLimit(60);  // 使用不太準的 sf::Clock (+-10-15ms)
  • 更改視窗成全螢幕模式
window.create(sf::VideoMode(800, 600), "test", sf::Style::Fullscreen);

這裡只列出常用的,其他設定請參考 Docs

SFML 支援多個建立窗口,但有一些限制:可以在不同的 thread,但獲取事件時一定要在窗口自己的 thread 上,建議的做法是用 main thread 管理窗口跟事件,然後其他例如:渲染、物理等,拿到其他 thread。

SFML 不像其他 GUI Library 提供許多窗口的功能,可以用 window.getSystemHandle() 來拿到底層的窗口 Handle,之後可以用 OS-Specific 的 function 做事

sf::WindowHandle handle = window.getSystemHandle();
// Use handle

上一篇
從零開始寫遊戲 SFML 介紹
下一篇
SFML Event
系列文
寫遊戲初體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言